Upgrading software on a complex computer system can be a difficult process. Some computer systems comprise multiple server systems in communication with one another and require synchronization of code upgrades (e.g., each server system needs to transition from the old code version to the new code version at the same time). Some computer systems comprise multiple clients that need to be treated independently (e.g., some clients require the old code version and some clients require the new code version). Some computer systems comprise large code bases including a large number of code changes that may be in progress at any given time. This complexity creates a problem where it is difficult to keep track of which code version should be used for a particular execution.